package com.hcss.common.redis.base;

import org.springframework.data.redis.core.ListOperations;

import java.util.List;

/**
 * @描述: redis list类型数据操作Dao接口
 * @作者: xuqian
 * @创建日期: 2018-01-12 18:09
 * @公司 浙江鸿程计算机系统有限公司
 */
public interface RedisListDao<T> extends BaseRedisDao<T> {
    /**
     * 获取当前操作ListOperations
     * @return
     */
    ListOperations getListOperations();

    /**
     * 插入单个数据到队列尾部
     * @param key
     * @param value
     */
    void rightInsert(String key, T value);

    /**
     * 插入集合到队列尾部
     * @param key
     * @param list
     */
    void rightInsertAll(String key, List<T> list);

    /**
     * 插入一组数据到队列尾部
     * @param key
     * @param values
     */
    void rightInsertAll(String key, T... values);

    /**
     * 插入单个数据到队列首部
     * @param key
     * @param value
     */
    void leftInsert(String key, T value);

    /**
     * 插入集合到队列首部
     * @param key
     * @param list
     */
    void leftInsertAll(String key, List<T> list);

    /**
     * 插入一组数据到队列首部
     * @param key
     * @param values
     */
    void leftInsertAll(String key, T... values);

    /**
     * 获取全部集合
     * @param key
     * @return
     */
    List<T> selectAll(String key);

    /**
     * 从key对应的list集合获取从start下标开始到end下标的数据集合
     * 0表示list的开头第一，-1表示list的倒数第一个，即最后一个。
     * -2则便是list的倒数第二个，以此类推。
     * @param key
     * @param start
     * @param end
     * @return
     */
    List<T> selectList(String key, long start, long end);

    /**
     * 在pvalue值左侧插入value值
     * @param key
     * @param pvalue
     * @param value
     */
    void insertLeft(String key, T pvalue, T value);

    /**
     * 在pvalue值右侧插入value值
     * @param key
     * @param pvalue
     * @param value
     */
    void insertRight(String key, T pvalue, T value);

    /**
     * 从start下标开始到end下标结束分割集合
     * @param key
     * @param start
     * @param end
     */
    void subList(String key, long start, long end);

    /**
     * 获取key对应list集合长度
     * @param key
     * @return
     */
    Long getSize(String key);

    /**
     * 设置key对应list集合的index下标数据为value
     * @param key
     * @param value
     * @param index
     */
    void setValue(String key, T value, long index);

    /**
     * 获取key对应list集合下标为index的数值
     * @param key
     * @param index
     * @return
     */
    T get(String key, long index);

    /**
     * 删除key对应list集合第一个值为value的数据
     * @param key
     * @param value
     */
    void remove(String key, T value);
}